nanopyx.core.transform.image_rotate

Combination of functions for rotating an image, using several interpolation methods.

 1"""
 2Combination of functions for rotating an image, using several interpolation methods.
 3"""
 4
 5from scipy.ndimage import rotate
 6import numpy as np
 7
 8from ..utils.timeit import timeit2
 9from . import interpolation_bicubic
10from . import interpolation_bilinear
11from . import interpolation_nearest_neighbor
12from . import interpolation_catmull_rom
13from . import interpolation_lanczos
14
15from skimage.transform import AffineTransform, warp
16import cv2
17
18@timeit2
19def catmull_rom_rotate(image: np.ndarray, angle:float):
20    interpolator = interpolation_catmull_rom.Interpolator(image)
21    return interpolator.rotate(angle)
22
23
24@timeit2
25def lanczos_rotate(image: np.ndarray, angle:float):
26    interpolator = interpolation_lanczos.Interpolator(image)
27    return interpolator.rotate(angle)
28
29
30@timeit2
31def bicubic_rotate(image: np.ndarray, angle:float):
32    interpolator = interpolation_bicubic.Interpolator(image)
33    return interpolator.rotate(angle)
34
35
36@timeit2
37def bilinear_rotate(image: np.ndarray, angle:float):
38    interpolator = interpolation_bilinear.Interpolator(image)
39    return interpolator.rotate(angle)
40
41
42@timeit2
43def nearest_neighbor_rotate(image: np.ndarray, angle:float):
44    interpolator = interpolation_nearest_neighbor.Interpolator(image)
45    return interpolator.rotate(angle)
46
47
48@timeit2
49def scipy_rotate(image: np.ndarray, angle:float):
50    return rotate(image, np.rad2deg(angle), reshape=False)
51
52
53@timeit2
54def skimage_rotate(image: np.ndarray, angle:float):
55    rotation = AffineTransform(rotation=angle)
56    shift2center = AffineTransform(translation=-np.array(image.shape[:2][::-1]) / 2)
57    shift2og = AffineTransform(translation=np.array(image.shape[:2][::-1]) / 2)
58    return warp(image, shift2center + rotation + shift2og)
59
60
61@timeit2
62def cv2_rotate(image: np.ndarray, angle:float):
63    rotmat = cv2.getRotationMatrix2D(np.array(image.shape[:2][::-1]) / 2, np.rad2deg(angle), 1)
64    return cv2.warpAffine(image, rotmat, image.shape[:2][::-1])